#include "System.h"
#include "..\cgraphics\CGraphics.h"
#include <math.h>

void ParseCommand_PersiapanMode(Reader R) {
	if(R.nArgument == 0) {
		StartPrintMsg(); printf("Perintah kosong!\n");
	}
	else if(IsStringEqual(R.argument[0],LOAD_COMMAND)) {
		ParseLoadCommand(R);
	}
	else if(IsStringEqual(R.argument[0],ADDCONN_COMMAND)) {
		ParseAddConnCommand(R);
	}
	else if(IsStringEqual(R.argument[0],ADDSITE_COMMAND)) {
		ParseAddSiteCommand(R);
	}
	else if(IsStringEqual(R.argument[0],OPEN_COMMAND)) {
		ParseOpenCommand(R);
	}
	else if(IsStringEqual(R.argument[0],SAVE_COMMAND)) {
		ParseSaveCommand(R);
	}
	else if(IsStringEqual(R.argument[0],CREATE_COMMAND)) {
		ParseCreateCommand(R);
	}
	else if(IsStringEqual(R.argument[0],LIST_COMMAND)) {
		DeleteArguments(&R,0,1);
		string s = ArgumentsToString(R);
		ParseListCommand(s.s);
	}
	else if(IsStringEqual(HELP__COMMAND,R.argument[0])) {
		ParseHelpCommand_PersiapanMode();
	}
	else if(IsStringEqual(RESET_COMMAND,R.argument[0])) {
		ParseResetCommand();
	}
	else if(IsStringEqual(R.argument[0],EXIT_COMMAND) || IsStringEqual(R.argument[0],CLOSE_COMMAND)) {
		ParseExitCommand_PersiapanMode();
	}
	else {
		StartPrintMsg(); SetColor(FRI); printf("ERROR : Perintah tidak dikenali\n");
	}
}

void ParseAddConnCommand(Reader R) {
	if(R.nArgument < 5) {
		StartPrintMsg(); printf("ERROR : Jumlah argumen tidak valid, seharusnya 5");
	}
	else if(SearchNodeByName(&NODELIST,R.argument[1])==NULL) {
		StartPrintMsg(); printf("ERROR : %s tidak ditemukan",R.argument[1].s);
	}
	else if(SearchNodeByName(&NODELIST,R.argument[2])==NULL) {
		StartPrintMsg(); printf("ERROR : %s tidak ditemukan",R.argument[2].s);
	}
	else if(!IsStringFloat(R.argument[3])) {
		StartPrintMsg(); printf("ERROR : %s bukan angka",R.argument[3].s);
	}
	else if(!IsStringFloat(R.argument[4])) {
		StartPrintMsg(); printf("ERROR : %s bukan angka",R.argument[4].s);
	}
	else {
		edgeAddress n = AllocateEdge(	SearchNodeByName(&NODELIST,R.argument[1]),
									SearchNodeByName(&NODELIST,R.argument[2]),
									fabs(StringToFloat(R.argument[3])),fabs(StringToFloat(R.argument[4]))
									);
		if(n==NULL) {
			StartPrintMsg(); printf("SYSTEM ERROR : Alokasi memori gagal");
		}
		else {
			AddEdge(&EDGELIST,n);
			StartPrintMsg(); SetColor(FGI); printf("Koneksi antara %s dan %s berhasil dibangun",NODENAME(GetA(n)).s,NODENAME(GetB(n)).s);
		}
	}
}

void ParseAddSiteCommand(Reader R) {
	if(R.nArgument < 8) {
		StartPrintMsg(); printf("ERROR : Jumlah argumen tidak valid, seharusnya 8");
	}
	else if(SearchNodeByName(&NODELIST,R.argument[1])!=NULL) {
		StartPrintMsg(); printf("ERROR : node dengan nama %s sudah ada",R.argument[1].s);
	}
	else if(!IsStringFloat(R.argument[4])) {
		StartPrintMsg(); printf("ERROR : %s bukan angka",R.argument[4].s);
	}
	else if(!IsStringFloat(R.argument[5])) {
		StartPrintMsg(); printf("ERROR : %s bukan angka",R.argument[5].s);
	}
	else if(!IsStringFloat(R.argument[6])) {
		StartPrintMsg(); printf("ERROR : %s bukan angka",R.argument[6].s);
	}
	else if(!IsStringFloat(R.argument[7])) {
		StartPrintMsg(); printf("ERROR : %s bukan angka",R.argument[7].s);
	}
	else {
		nodeAddress n = AllocateNode(	R.argument[1],
									fabs(StringToFloat(R.argument[4])),
									fabs(StringToFloat(R.argument[5])),
									fabs(StringToFloat(R.argument[6])),
									fabs(StringToFloat(R.argument[7])),
									(IsStringEqual(R.argument[3],CharToString("YES")) || IsStringEqual(R.argument[3],CharToString("Y"))),
									(IsStringEqual(R.argument[2],CharToString("YES")) || IsStringEqual(R.argument[2],CharToString("Y")))
								   );
		if(n==NULL) {
			StartPrintMsg(); printf("SYSTEM ERROR : Alokasi memori gagal");
		}
		else {
			AddNode(&NODELIST,n);
			StartPrintMsg(); SetColor(FGI); printf("node %s berhasil dibangun",NODENAME(n).s);
		}
	}
}

void ParseOpenCommand(Reader R) {
	if(R.nArgument < 2) {
		StartPrintMsg(); printf("ERROR : Jumlah argumen tidak valid, seharusnya 2");
	}
	else if(SearchNodeByName(&NODELIST,R.argument[1])==NULL){
		StartPrintMsg(); printf("ERROR : node dengan nama %s tidak ditemukan",R.argument[1].s);
	}
	else if(!HAS_CLIENT(SearchNodeByName(&NODELIST,R.argument[1]))){
		StartPrintMsg(); printf("ERROR : node dengan nama %s tidak mempunyai klien",R.argument[1].s);
	}
	else if(SearchEdgeByNode(&EDGELIST,SearchNodeByName(&NODELIST,R.argument[1]))==NULL) {
		StartPrintMsg(); printf("ERROR : %s adalah node terpencil, simulasi tidak dapat dilakukan dari sini",R.argument[1].s);
	}
	else {
		ACTIVENODE = SearchNodeByName(&NODELIST,R.argument[1]);
		ChangeModus(SIMULASI);
	}
}

void ParseCreateCommand(Reader R) {
	if(R.nArgument<3) {
		StartPrintMsg(); printf("ERROR : Jumlah argumen tidak valid, seharusnya 3");
	}
	else if(SearchNodeByName(&NODELIST,R.argument[2])==NULL) {
		StartPrintMsg(); printf("ERROR : Node bernama %s tidak ditemukan", R.argument[2].s);
	}
	else if(!HAS_SERVER(SearchNodeByName(&NODELIST,R.argument[2]))) {
		StartPrintMsg(); printf("ERROR : Node bernama %s tidak mempunyai server", R.argument[2].s);
	}
	else {
		nodeAddress to = SearchNodeByName(&NODELIST,R.argument[2]);
		if(IsStringEqual(R.argument[1],NAMATABELMHS)) {
			if(HAS_TMHS(to)) {
				StartPrintMsg(); printf("ERROR : Tabel sudah ada");
			}
			else {
				ChangeNodeTableAvailability(to, true, HAS_TMK(to), HAS_TPMK(to));
				StartPrintMsg(); SetColor(FGI); printf("Tabel berhasil ditambahkan");
			}
		}
		else if(IsStringEqual(R.argument[1],NAMATABELMK)) {
			if(HAS_TMK(to)) {
				StartPrintMsg(); printf("ERROR : Tabel sudah ada");
			}
			else {
				ChangeNodeTableAvailability(to, HAS_TMHS(to), true, HAS_TPMK(to));
				StartPrintMsg(); SetColor(FGI); printf("Tabel berhasil ditambahkan");
			}
		}
		else if(IsStringEqual(R.argument[1],NAMATABELPMK)) {
			if(HAS_TPMK(to)) {
				StartPrintMsg(); printf("ERROR : Tabel sudah ada");
			}
			else {
				ChangeNodeTableAvailability(to, HAS_TMHS(to), HAS_TMK(to), true);
				StartPrintMsg(); SetColor(FGI); printf("Tabel berhasil ditambahkan");
			}
		}
		else {
			StartPrintMsg(); printf("Tabel %s tidak terdefinisi",R.argument[1].s);
		}
	}
}
	
void ParseHelpCommand_PersiapanMode() {
	StartPrintProcess(); printf("Perintah yang tersedia : ");
	ContinuePrintProcess(); printf("  Load <filename>");
	ContinuePrintProcess(); printf("  Save [filename]");
	ContinuePrintProcess(); printf("  Create <nama tabel> <nama node>");
	ContinuePrintProcess(); printf("  Open <nama node>");
	ContinuePrintProcess(); printf("  AddConn <nama node> <nama node> <upload speed> <download speed>");
	ContinuePrintProcess(); printf("  AddSite <nama node> <Server-Y/T> <Client-Y/T> <retrieve> <update> <insert> <delete>");
	ContinuePrintProcess(); printf("  Exit");
	ContinuePrintProcess(); printf("  Reset");
	ContinuePrintProcess(); printf("  List");
	ContinuePrintProcess();
	string a = NAMATABELMHS, b = NAMATABELMK, c = NAMATABELPMK;
	ContinuePrintProcess(); printf("Nama Tabel : %s, %s, %s", a.s, b.s, c.s);
}

void ParseResetCommand() {
	DestroyAll();
	if(IsStringStrictEqual(SOURCEFILE,UNDEFINEDFILE)) {
		StartPrintMsg(); SetColor(FGI); printf("Kondisi telah dikembalikan");
	}
	else {
		LoadFile(SOURCEFILE);
		StartPrintMsg(); SetColor(FGI); printf("Kondisi telah dikembalikan sesuai %s", SOURCEFILE.s);
	}
}

void ParseExitCommand_PersiapanMode() {
	MODUS = SELESAI;
}

